package com.lvhx.xxljob;

import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Slf4j
@Component
public class FullFeatureXxlJob {

    /**
     * 1. 简单任务示例（Bean模式）
     * 可配置参数：
     * - init：任务初始化方法
     * - destroy：任务销毁方法
     */
    @XxlJob(value = "demoFullJobHandler", init = "init", destroy = "destroy")
    public void demoFullJobHandler() throws Exception {
        log.info("任务开始执行...");

        // 1. 获取任务参数
        String jobParam = XxlJobHelper.getJobParam();
        XxlJobHelper.log("任务参数: {}", jobParam);
        log.info("任务参数: {}", jobParam);

        // 2. 分片参数处理
        int shardIndex = XxlJobHelper.getShardIndex();
        int shardTotal = XxlJobHelper.getShardTotal();
        XxlJobHelper.log("分片参数：当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);
        
        // 3. 业务逻辑
        try {
            for (int i = 0; i < 5; i++) {
                XxlJobHelper.log("执行中... {}", i);
                TimeUnit.SECONDS.sleep(1);
                
                // 4. 业务执行结果判断
                if (i == 3) {
                    throw new RuntimeException("模拟业务异常");
                }
            }
            
            // 5. 手动设置任务成功
            XxlJobHelper.handleSuccess("任务执行成功，自定义成功消息");
        } catch (Exception e) {
            // 6. 手动设置任务失败
            XxlJobHelper.handleFail("任务执行失败: " + e.getMessage());
            throw e;
        }
    }
    
    /**
     * 任务初始化方法
     */
    public void init() {
        XxlJobHelper.log("任务初始化...");
    }
    
    /**
     * 任务销毁方法
     */
    public void destroy() {
        XxlJobHelper.log("任务销毁...");
    }
    
    /**
     * 2. 带参数的任务示例
     */
    @XxlJob("paramJobHandler")
    public ReturnT<String> paramJobHandler(String param) throws Exception {
        // 参数可以直接在方法参数中接收
        XxlJobHelper.log("接收参数: {}", param);
        
        // 也可以使用ReturnT返回结果
        if ("success".equals(param)) {
            return ReturnT.SUCCESS;
        } else {
            return new ReturnT<>(ReturnT.FAIL_CODE, "自定义失败信息");
        }
    }
    
    /**
     * 3. 父子任务示例
     */
    @XxlJob("parentJobHandler")
    public void parentJobHandler() throws Exception {
        XxlJobHelper.log("父任务开始执行");
        
        // 触发子任务
        for (int i = 0; i < 3; i++) {
            String childParam = "子任务参数-" + i;
            XxlJobHelper.log("触发子任务: {}", childParam);
            
            // 实际项目中可以通过XXL-Job的API触发子任务
            // 这里只是示例
            ReturnT<String> childResult = childJobHandler(childParam);
            XxlJobHelper.log("子任务结果: {}", childResult);
        }
        
        XxlJobHelper.log("父任务执行完成");
    }
    
    /**
     * 子任务处理器
     */
    public ReturnT<String> childJobHandler(String param) {
        XxlJobHelper.log("子任务执行，参数: {}", param);
        return ReturnT.SUCCESS;
    }
}